const {db} = require("../Schema/config");
const UserSchema = require("../Schema/user");
const encrypt = require("../util/crypt");

//通过db对象创建操作user表的模型对象
const User = db.model("users", UserSchema);

//用户注册
exports.reg = async (ctx) => {
  //用户注册时发过来的数据
  const user = ctx.request.body;  //用户请求体
  const username = user.username;
  const password = user.password;

  /*
  * 注册时应该干什么
  * 1.去user数据库查询用户名是否存在
  * 2.密码不能明文存储
  * */
  await new Promise((resolve, reject) => {
    //去 users数据库查询
    User.find({
      username: username
    }, (err, data) => {
      //查询是否出错
      if (err) {
        return reject(err)
      }
      //是否查询到数据
      if (data.length !== 0) {  //查询到数据
        return resolve("用户名已存在")
      } else {
        //用户名不存在，可以存在数据库,保存在数据库需要先加密
        const _user = new User({
          username,
          password: encrypt(password)
        });
        _user.save((err, data) => {
          if (err) {
            reject(err)
          } else {
            resolve(data)
          }
        })
      }
    })
  })
    .then(async (res) => {
    if (res === "用户名已存在") {
      //用户名已存在
      await ctx.render("isOk", {
        status: "用户名已存在"
      })
    } else {
      //用户名注册成功
      ctx.render("isOk", {
        status: "注册成功"
      })
    }
  }).catch(async (err) => {
    await ctx.render("isOk", {
      status: "注册失败"
    })
  })
};

// 用户登录
exports.login = async ctx => {
  // 拿到 post 数据
  const user = ctx.request.body;
  const username = user.username;
  const password = user.password;

  await new Promise((resolve, reject) => {
    User.find({username}, (err, data) => {
      if(err)return reject(err);
      if(data.length === 0) return reject("用户名不存在");

      // 把用户传过来的密码 加密后跟数据库的比对
      if(data[0].password === encrypt(password)){
        return resolve(data)
      }
      resolve("")
    })
  })
    .then(async data => {
      if(!data){
        return ctx.render('isOk', {
          status: "密码不正确，登录失败"
        })
      }

      // 让用户在他的 cookie 里设置 username password 加密后的密码 权限。这里用户名不能直接存中文，所以我们需要先用buffer将中文转换成64位编码，然后在取名字的时候，再将64位编码转换回来
      ctx.cookies.set("username", data[0].username, {
        domain: "localhost",
        path: "/",
        maxAge: 36e5,
        httpOnly: true, // true 不让客户端能访问这个 cookie
        overwrite: false
      });
       // 用户在数据库的_id 值
      ctx.cookies.set("uId", data[0]._id, {
        domain: "localhost",
        path: "/",
        maxAge: 36e5,
        httpOnly: true, // true 不让客户端能访问这个 cookie
        overwrite: false
      });

      ctx.session = {
        username: data[0].username,
        uid: data[0]._id,
        avatar: data[0].avatar
      };
      
      // 登录成功
      await ctx.render("isOk", {
        status: "登录成功"
      })
    })
    .catch(async err => {
      console.log(err);
      await ctx.render("isOk", {
        status: "登录失败"
      })
    })
};

//确定用户状态，会根据情况保持用户状态
exports.keepLog = async (ctx,next) =>{
  //isNew,用户登陆过后这个就为undefined。登录过就是true
  if(ctx.session.isNew){   //session没有数据
    if(ctx.cookies.get("uId")){
      ctx.session = {
        "username":new Buffer(ctx.cookies.get("username"),'base64').toString(),
        "uId":ctx.cookies.get("uId")
      }
    }
  }
  await next();
};

//用户退出
exports.logout = async (ctx,next) => {
  ctx.session = null;
  ctx.cookies.set("username",null,{
    maxAge:0
  });
  ctx.cookies.set("uId",null,{
    maxAge:0
  });
  //退出登录之后，重定向到首页
  ctx.redirect("/")
};
